package cn.zbzcode.hrm.service.impl;

import cn.zbzcode.hrm.domain.CourseType;
import cn.zbzcode.hrm.feign.client.RedisFeignClient;
import cn.zbzcode.hrm.mapper.CourseTypeMapper;
import cn.zbzcode.hrm.redis.RedisKey;
import cn.zbzcode.hrm.service.ICourseTypeService;
import cn.zbzcode.hrm.utils.AjaxResult;
import cn.zbzcode.hrm.vo.CrumbsVo;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author zbz
 * @since 2020-04-18
 */
@Service
@Transactional
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {

    @Autowired
    private RedisFeignClient redisFeignClient;

    @Override
    public boolean updateById(CourseType entity) {
        boolean result = super.updateById(entity);
        if(result){
            getCourseTypesToRedis();
        }
        return result;
    }

    @Override
    public boolean deleteById(Serializable id) {
        boolean result = super.deleteById(id);
        if(result){
            getCourseTypesToRedis();
        }
        return result;
    }

    @Override
    public boolean insert(CourseType entity) {
        boolean result = super.insert(entity);
        if(result){
            getCourseTypesToRedis();
        }
        return result;
    }

    private List<CourseType> selectCourseTypeFromCache(){
        //查询Redis是否有数据
        AjaxResult ajaxResultFromRedis = redisFeignClient.get(RedisKey.KEY_COURSETYPE);
        //如果在缓存中拿到数据
        if(ajaxResultFromRedis.isSuccess() && ajaxResultFromRedis.getResultObj() != null){
            //把拿到的数据转为字符串
            String courseTypeJson = ajaxResultFromRedis.getResultObj().toString();
            //再把String数据解析为List
            List<CourseType> courseTypes = JSON.parseArray(courseTypeJson, CourseType.class);
            return  courseTypes;
        }
        List<CourseType> courseTypes = getCourseTypesToRedis();
        return courseTypes;
    }

    private List<CourseType> getCourseTypesToRedis() {
        List<CourseType> courseTypes = baseMapper.selectList(null);
        redisFeignClient.set(RedisKey.KEY_COURSETYPE, JSON.toJSONString(courseTypes));
        return courseTypes;
    }


    @Override
    public List<CourseType> treeData() {
        List<CourseType> parentCourseTypeList = new ArrayList<>( );
        //List<CourseType> allCourseType = baseMapper.selectList(null);
        List<CourseType> allCourseType = selectCourseTypeFromCache();
        allCourseType.forEach(currentCourseType ->{
            if(currentCourseType.getPid() == 0){
                parentCourseTypeList.add(currentCourseType);
            }else{
                for(CourseType parentCouresType : allCourseType){
                    if(currentCourseType.getPid().equals(parentCouresType.getId())){
                        parentCouresType.getChildren().add(currentCourseType);
                        break;
                    }
                }
            }
        });
        return parentCourseTypeList;
    }

    @Override
    public List<CrumbsVo> crumbs(Long courseTypeId) {
        List<CrumbsVo> result = new ArrayList<>() ;

        //1.根据id查询分类对象
        CourseType courseType = baseMapper.selectById(courseTypeId);

        //2.处理数据不规范（主要是前后有点(.)问题）
        String pathString = courseType.getPath();
        pathString = pathString.startsWith(".")? pathString.substring(1):pathString;
        pathString = pathString.endsWith(".")? pathString.substring(0,pathString.length()-1):pathString;

        //3.获取当前分类的path，然后切割成数组(id数组) ：1037.1039.1040  -> [1037 ,1039 ,1040]
        String[] courseTypeIdStr = pathString.split("\\.");

        List<Long> ids = new ArrayList<>();
        for(String idStr : courseTypeIdStr){
            ids.add(Long.valueOf(idStr));
        }

        //4.通过课程分类的id数组,批量查询课程分类列表 ：[courseType,CourseType,CourseType]
        List<CourseType> courseTypes = baseMapper.selectBatchIds(ids);

        //5.遍历程分类列表，每个课程分类就是一个CrumbsVo : [CrumbsVo , CrumbsVo, CrumbsVo]

        courseTypes.forEach( currentCourseType -> {
            //把当前课程分类 currentCourseType ,封装到  CrumbsVo.OwnerProductType
            CrumbsVo  vo = new CrumbsVo();
            vo.setOwnerProductType(currentCourseType);

            //5.为每一个课程类型找他的兄弟姐妹列表，设置到CrumbsVo.otherProductTypes列表中
            Long pid = currentCourseType.getPid();
            List<CourseType> otherProductTypes = baseMapper.selectListByPid(pid);
            vo.setOtherProductTypes(otherProductTypes);
            result.add(vo);
        });

        //6.最后返回结果List
        return result;
    }
}
